package support.limit.ratelimit.impl;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import support.limit.enums.RateLimitConstantEnums;
import support.limit.exception.RateLimitException;
import support.limit.model.LimitDTO;
import support.limit.ratelimit.AbstractRateLimiter;

import java.util.ArrayList;
import java.util.List;

/**
 *  计数器算法实现限流
 * @Description  RedisRateLimiterCounterImpl
 * @Author guoyb
 * @Date   2023/12/22 14:23
 */
@Slf4j
public class RedisRateLimiterCounterImpl extends AbstractRateLimiter {

    @Autowired
    private RedisTemplate redisTemplate;

    private DefaultRedisScript<Long> defaultRedisScript;

    public RedisRateLimiterCounterImpl(DefaultRedisScript<Long> defaultRedisScript) {
        this.defaultRedisScript = defaultRedisScript;
    }

    @Override
    public void rateLimit(LimitDTO limitDTO) {
        List<Object> keyList = new ArrayList<>();
        keyList.add(key);
        keyList.add(limit + RateLimitConstantEnums.HASH_TAG);
        keyList.add(refreshInterval + RateLimitConstantEnums.HASH_TAG);
        String toString = redisTemplate.execute(defaultRedisScript, keyList, keyList).toString();
        if (RateLimitConstantEnums.REDIS_ERROR.equals(toString)) {
            throw new RateLimitException(message);
        }
    }

}
